package servlets;

import dao.IdaoLocal;
import entities.*;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.swing.JOptionPane;
import servlets.tools.CalcIdMax;
import servlets.tools.Cart_calcTotalPrice;

/**
 *
 * eCOM - Adopte un Presta - Mars-Avril 2013
 * @author Kheira, Jef, William, Tuan-Long
 */
@WebServlet(name = "ServletChargementDonnees", urlPatterns = {"/ServletChargementDonnees"})
public class ServletChargementDonnees extends HttpServlet {
    //private static final long serialVersionUID = 1L;
    
    @EJB
    private IdaoLocal daoJpa;
   

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, SQLException, ClassNotFoundException {

        Class.forName("com.mysql.jdbc.Driver");
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        String idAction;        
        idAction = request.getParameter("action");
        
        if (idAction == null) {
            idAction = "productStores";
        }
        
            if (idAction.equals("login")) 
            {
                login(request, response);
            }
            else if (idAction.equals("logout")) 
            {
                logout(request, response);
            }
            else if (idAction.equals("gotoSubscribe")) 
            {
                gotoSubscribe(request, response);
            }
            else if (idAction.equals("subscribe")) 
            {
                subscribe(request, response);
            }
            else if (idAction.equals("rechercher")) 
            {
                rechercher(request, response);
            }
            else if (idAction.equals("productStores")) 
            {
                productStores(request, response);
            } 
            else if (idAction.equals("categorie")) 
            {
                categorie(request, response);
            }
            else if (idAction.equals("product")) 
            {
                product(request, response);          
            }
            else if (idAction.equals("productManager")) 
            {
                productManager(request, response);
            }
            else if (idAction.equals("projectManager")) 
            {
                projectManager(request, response);
            }
            else if (idAction.equals("developer")) 
            {
                developer(request, response);
            }
            else if (idAction.equals("architect")) 
            {
                architect(request, response);
            }
            else if (idAction.equals("coach")) 
            {
                coach(request, response);
            }
            else if (idAction.equals("consultant")) 
            {
                consultant(request, response);                
            }
            else if (idAction.equals("ajoutAccount")) 
            {
                ajoutAccount(request, response);
            }
            else if (idAction.equals("afficherMonCompte"))
            {
                afficherMyAccount(request, response);
            }
            else if (idAction.equals("monCompte_credit"))
            {
                monCompte_credit(request, response);
            }
              else if (idAction.equals("modifierAccount")) 
            {
                modifierAccount(request, response);
            }
             else if (idAction.equals("modifierAccount2")) 
            {
                modifierAccount2(request, response);
            }  
            else if (idAction.equals("supprimerAccount")) 
            {
                supprimerAccount(request, response);
            }  
            else if (idAction.equals("ajoutPresta")) 
            {
                    try {    
                        ajoutPresta(request, response);
                    } catch (ParseException ex) {
                        Logger.getLogger(ServletChargementDonnees.class.getName()).log(Level.SEVERE, null, ex);
                    }
            }
             else if (idAction.equals("modifierPresta")) 
            {
                modifierPresta(request, response);    
            }
            else if (idAction.equals("modifierPresta2")) 
            {
                modifierPresta2(request, response);    
            } 
            else if (idAction.equals("supprimerPresta")) 
            {
                supprimerPresta(request, response);    
            } 
            else if (idAction.equals("ajoutProductStore")) 
            {
                ajoutProductStore(request, response);    
            }
             else if (idAction.equals("modifierProductStore")) 
            {
                modifierProductStore(request, response);    
            }
             else if (idAction.equals("modifierProductStore2")) 
            {
                modifierProductStore2(request, response);    
            } 
            else if (idAction.equals("supprimerProductStore")) 
            {
                supprimerProductStore(request, response);    
            }       
            else if (idAction.equals("afficherPresta")) 
            {
                afficherPresta(request, response);
            }
            else if (idAction.equals("ajouterPrestaPanier")) 
            {
                int idSelectedPresta = Integer.parseInt(request.getParameter("selected_presta"));
                ajouterPrestaPanier(request, response, idSelectedPresta);
            }
            else if (idAction.equals("retirerPrestaPanier")) 
            {
                int idSelectedPresta = Integer.parseInt(request.getParameter("selected_presta"));
                retirerPrestaPanier(request, response, idSelectedPresta);
            }
            else if (idAction.equals("displayCart")) 
            {
                displayCart(request, response);
            }
            else if (idAction.equals("buyCart")) 
            {
                buyCart(request, response);
            }
            else if (idAction.equals("buycart_p1_valider")) 
            {
                buycart_p1_valider(request, response);
            }
            else if (idAction.equals("buycart_p2_login")) 
            {
                buycart_p2_login(request, response);
            }
            else if (idAction.equals("buycart_p2_subscribe")) 
            {
                buycart_p2_subscribe(request, response);
            }
            else if (idAction.equals("buycart_p3_valider")) 
            {
                buycart_p3_valider(request, response);
            }
            else if (idAction.equals("buycart_p4_payer")) 
            {
                buycart_p4_payer(request, response);
            }
            else if (idAction.equals("buycart_p4_credit")) 
            {
                buycart_p4_credit(request, response);
            }
            else if (idAction.equals("politiqueConf"))
            {
                politiqueConf(request, response);
            }
             else if (idAction.equals("ajouterCommentaire")) 
            {
                ajouterCommentaire(request, response);
            }
             else if (idAction.equals("ajoutCommentaire")) 
            {
                ajoutCommentaire(request, response);
            }
    }  
    
    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } catch (SQLException ex) {
            Logger.getLogger(ServletChargementDonnees.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (Exception e) {
            Logger.getLogger(ServletChargementDonnees.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            processRequest(request, response);
        } 
        catch (SQLException ex) {
            Logger.getLogger(ServletChargementDonnees.class.getName()).log(Level.SEVERE, null, ex);
        }
        catch (Exception e) {
            Logger.getLogger(ServletChargementDonnees.class.getName()).log(Level.SEVERE, null, e);
        }
    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
    
    // Authentification des clients 
    private void login(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        
	// Récupération des données du formulaire
        String login = (String) request.getParameter("login");
        String pwd = (String) request.getParameter("password");
        
        Account client = daoJpa.getAccountByLoginAndPass(login, pwd);
        if (client != null) 
        {
            HttpSession session = request.getSession();
            Collection userValues = daoJpa.getAllAccounts();
            Collection mesCategories = daoJpa.getAllCategories();
             Collection mesPrestataires = daoJpa.getAllProducts();
            Collection mesProductStore = daoJpa.getAllProductStore();

            session.setAttribute("account", client);
            session.setAttribute("userValues", userValues);
            session.setAttribute("mesCategories", mesCategories);
            session.setAttribute("mesPrestataires", mesPrestataires);
            session.setAttribute("mesProductStore", mesProductStore);
            session.setAttribute("isLoggedIn", "true");
            
            RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
            dispatcher.forward(request, response);
        }
        else 
        {              
            RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
            dispatcher.forward(request, response);
        }   
        
    }

    // Déconnexion
    private void logout(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
            HttpSession session = request.getSession();
            session.setAttribute("account", null);
            session.setAttribute("isLoggedIn", "false");

            RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp");
            dispatcher.forward(request, response);
    }
    
    // Clic sur le lien "Inscription"
    private void gotoSubscribe(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
            RequestDispatcher dispatcher = request.getRequestDispatcher("/subscribe.jsp");
            dispatcher.forward(request, response);
    }
    
    // Inscription à partir de subscribe.jsp
    private void subscribe(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        // Récupération des données du formulaire
        // Id de 0 = Auto-Incrément au dernier id ajouté
        int idAccount = 0;
        int accessLevel = 0;
        
        String nom  = (String) request.getParameter("nom");
        String prenom = (String) request.getParameter("prenom");
        String adresse  = (String) request.getParameter("adresse");
        double solde = new Double(0);
        String login = (String) request.getParameter("login");
        String password = (String) request.getParameter("password");
        String iban = (String) request.getParameter("iban"); 
        int idcart = 0;   
        daoJpa.addAccount(idAccount, nom, prenom, adresse, solde, login, password, accessLevel, iban, idcart);
        
        request.setAttribute("login", login);
        request.setAttribute("password", password);
        login(request, response);
    }   
    
    // Effectuer une recherche via la barre de recherche
    private void rechercher(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        String search_query = (String) request.getParameter("search_query");
        if (search_query == null) {
            search_query = "";
        }
        
        List<Product> tous_les_produits = new ArrayList<Product>();
        List<ProductStore> tous_les_partenaires = new ArrayList<ProductStore>();
        List<Product> rech_resultats = new ArrayList<Product>();
        List<ProductStore> rech_resultats2 = new ArrayList<ProductStore>();
        System.err.println("Servlet - rechercher - search_query ==" + search_query);
        
        tous_les_produits = daoJpa.getAllProducts();
        tous_les_partenaires = daoJpa.getAllProductStore();
         
        /* On effectue un parcours de la liste des partenaires pour afficher 
         * ceux qui contiennent la valeur cherchée */
         if (tous_les_partenaires != null) {
                Iterator<ProductStore> itp = tous_les_partenaires.iterator();
                while (itp.hasNext()) {
                    // Boucle sur le partenaire 
                    ProductStore ps_p = itp.next();
                    if (ps_p.getNom().toLowerCase().contains(search_query.toLowerCase())) {
                        rech_resultats2.add(ps_p);
                    }
                    else if (ps_p.getDescription().toLowerCase().contains(search_query.toLowerCase())) {
                        rech_resultats2.add(ps_p);
                    }
                }
         }     
                
        /* On effectue un parcours de la liste des produits pour afficher 
         * ceux qui contiennent la valeur cherchée */
        if (tous_les_produits != null) {
            Iterator<Product> itp = tous_les_produits.iterator();
            while (itp.hasNext()) {
                // Boucle sur le presta en lui-même
                Product p_tmp = itp.next();
                if (p_tmp.getNom().toLowerCase().contains(search_query.toLowerCase())) {
                    rech_resultats.add(p_tmp);
                }
                else if (p_tmp.getPrenom().toLowerCase().contains(search_query.toLowerCase())) {
                    rech_resultats.add(p_tmp);
                }
                else if (p_tmp.getDescription().toLowerCase().contains(search_query.toLowerCase())) {
                    rech_resultats.add(p_tmp);
                }
                else {
                    // Boucle sur le CV du presta
                    int id_CV = p_tmp.getCVidCV();
                    Cv cv_du_presta = daoJpa.getCvById(id_CV);
                    
                    if (cv_du_presta != null) {
                        if (cv_du_presta.getCompetences().toLowerCase().contains(search_query.toLowerCase()))
                        {
                            rech_resultats.add(p_tmp);
                        }
                        else if (cv_du_presta.getFormation().toLowerCase().contains(search_query.toLowerCase())){
                            rech_resultats.add(p_tmp);
                        }
                        else if (cv_du_presta.getLoisirs().toLowerCase().contains(search_query.toLowerCase())){
                            rech_resultats.add(p_tmp);
                        }
                        else if (cv_du_presta.getExperienceProfessionnelle().toLowerCase().contains(search_query.toLowerCase())){
                            rech_resultats.add(p_tmp);
                        }
                        else if (cv_du_presta.getSituationMatrimoniale().toLowerCase().contains(search_query.toLowerCase())){
                            rech_resultats.add(p_tmp);
                        }
                    }
                }
            }
        }
        
        if (!rech_resultats.isEmpty()) {
            request.setAttribute("searchResultsEmpty", "false");
        }
        else {
            request.setAttribute("searchResultsEmpty", "true");
        }
        if (!rech_resultats2.isEmpty()) {
            request.setAttribute("searchResults2Empty", "false");
        }
        else {
            request.setAttribute("searchResults2Empty", "true");
        }
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
        
        request.setAttribute("searchResults", rech_resultats);
        request.setAttribute("searchResults2", rech_resultats2);
        request.setAttribute("search_query", search_query);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/searchResults.jsp");
        dispatcher.forward(request, response);
    }
    
    // Récupère la liste des produits : des prestataires 
    private void product(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        Collection <Product> prestataires = daoJpa.getAllProducts();
        request.setAttribute("prestataires", prestataires);
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
              
        RequestDispatcher dispatcher = request.getRequestDispatcher("/portfolio_product.jsp");
        dispatcher.forward(request, response);
    }    
    
     // ajoute un produit (prestataire) et son CV dans la base
    private void ajoutPresta(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException, ParseException {
      
        // Récupération des données du formulaire 
        int idProduct = 0;
        int idCV = 0;
        int idCommande =0;
        System.out.println("idPresta: "+ idProduct);
        String nom  = (String) request.getParameter("nom");
        System.out.println("nom : "+ nom);
        String prenom = (String) request.getParameter("prenom");
        System.out.println("prenom : "+ prenom);
        String prix  = request.getParameter("prix");
        double doublePrix = Double.parseDouble(prix);
        System.out.println("prix : "+ doublePrix);
        String description = (String) request.getParameter("description");
        
        System.out.println("idCV : "+ idCV);
        
        String etat = (String) request.getParameter("etat");
        //String newEtat =  "'"+ etat +"'";  // pour l'énumération
           System.out.println("etat : "+ etat);
        String reference = (String) request.getParameter("reference");
            System.out.println("referenceProductStore: "+ reference);
            int intReference = Integer.parseInt(reference); 
        String categorie = (String) request.getParameter("categorie");
            System.out.println("categorie : "+ categorie);
            int intCategorie = Integer.parseInt(categorie);   
        System.out.println("idCommande : "+ idCommande);
        
        String dateNaissance  = (String) request.getParameter("dateNaissance");
        StringTokenizer st = new StringTokenizer (dateNaissance, "/");
        StringBuffer bf = new StringBuffer ();
        while (st.hasMoreTokens()) {
             //System.out.println(st.nextToken());
             bf.append(st.nextToken());
             //bf.append("-");
        }
        String maPremiereDate = bf.toString();
        
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-mm-dd");
        Date d = sdf.parse(maPremiereDate);
        System.out.println(d);
        
       
         System.out.println("Date de naissance: "+ maPremiereDate);
        String situationMatrimoniale = (String) request.getParameter("situationMatrimoniale");
         System.out.println("SituationMatrimoniale : "+ situationMatrimoniale);
        String formation  = (String) request.getParameter("formation");
        System.out.println("Formation : "+ formation);
        String competences  = (String) request.getParameter("competence");
        System.out.println("Compétences : "+ competences);
        String experience  = (String) request.getParameter("experience");
        System.out.println("Expériences : "+ experience);
        String loisirs  = (String) request.getParameter("loisir");
        System.out.println("Loisirs : "+ loisirs);
       // daoJpa.addProduct(nom , prenom, prix, description, idCV ,intReference, newEtat, intCategorie, idCommande);
        daoJpa.addProduct(idProduct,nom , prenom, doublePrix, description, 0 ,intReference, etat, intCategorie, 0);

        daoJpa.addCv(idCV, d, situationMatrimoniale, formation, competences, experience, loisirs);
        
        //Cv cv = daoJpa.getCvById(idCV);
        //Product p = daoJpa.getProductByNometPrenom(nom, prenom);
        //p.setCVidCV(cv.getIdCV());
        
        HttpSession session = request.getSession();
        Collection <Product> prestataires = daoJpa.getAllProducts();
        request.setAttribute("prestataires", prestataires);
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
                
        RequestDispatcher dispatcher = request.getRequestDispatcher("/portfolio_product.jsp");
        dispatcher.forward(request, response);
    } 
    
     // ajoute un compte dans la base
    private void ajoutAccount(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération des données du formulaire 
        int idAccount = 0;
        int accessLevel = 1;
        String nom  = (String) request.getParameter("nom");
        String prenom = (String) request.getParameter("prenom");
        String adresse  = (String) request.getParameter("adresse");
        double solde = Double.parseDouble((request.getParameter("solde")));
        String login = (String) request.getParameter("login");
        String password = (String) request.getParameter("password");
        String iban = (String) request.getParameter("iban"); 
        int idcart = 0;   
        daoJpa.addAccount(idAccount, nom, prenom, adresse, solde, login, password, accessLevel, iban, idcart);
        
        HttpSession session = request.getSession();
            Collection userValues = daoJpa.getAllAccounts();        
            session.setAttribute("userValues", userValues);           
        
            RequestDispatcher dispatcher = request.getRequestDispatcher("/modifAccount.jsp");
            dispatcher.forward(request, response);
    } 
    
    // Afficher notre compte utilisateur
    public void afficherMyAccount(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        Account monCompte = (Account) request.getSession().getAttribute("account");

        List<Product> lp = new ArrayList<Product>();
        List<Commande> lc = new ArrayList<Commande>();
        
        if (monCompte != null) {
            lp = daoJpa.getAllProducts();
            lc = daoJpa.getAllCommandesOfAccount(monCompte.getIdAccount());
        }
        
        if (lc.isEmpty()) {
            System.err.println("servlet -- afficherMyAccount : lc est vide.");
            request.setAttribute("monCompte_noCommande", "true");
        }
        else {
            request.setAttribute("monCompte_noCommande", "false");
        }
        
        // Liste des photos pour les commandes
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);

        request.setAttribute("monCompte_lp", lp);
        request.setAttribute("monCompte_lc", lc);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/monCompte.jsp");
        dispatcher.forward(request, response);
    }
    
    // Afficher notre compte utilisateur
    public void monCompte_credit(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        Account acc = (Account) request.getSession().getAttribute("account");
        // acc ne peut pas être nul à ce stade ( l'accès à cette page requiert un login )

        // TODO ( W. ) : Gérer l'historique des commandes ( ce n'est pas fait encore ).
        
        // Récupération des crédits donnés
        int added_credits_i = Integer.parseInt(request.getParameter("monCompte_credits"));
        double added_credits_d = (double) added_credits_i;
        
        // Mise à jour du compte
        daoJpa.updateAccountWithSolde(acc, added_credits_d);
        Account new_acc = daoJpa.getAccountById(acc.getIdAccount());
        
        HttpSession session = request.getSession();
        session.setAttribute("account", new_acc);
        
        afficherMyAccount(request, response);
    }
    
     // modifier un compte dans la base
    private void modifierAccount(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération le compte sélectionné
        String id = (String) request.getParameter("idAccountModif");
         System.out.println("idString : "+ id);
        int idAccount = Integer.parseInt(id);     
         System.out.println("idSelectionné : "+ idAccount);
        Account a = (Account) daoJpa.getAccountById(idAccount); 
  
        request.getSession().setAttribute("accountModif", a);
        RequestDispatcher dispatcher = request.getRequestDispatcher("/modifAccount2.jsp");
        dispatcher.forward(request, response);
    } 
    
    // modifier le compte dans la base
    private void modifierAccount2(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        String id = (String) request.getParameter("idAccountModif");
        // System.out.println("idString : "+ id);
        int idAccount = Integer.parseInt(id);     
         System.out.println("idSelectionné : "+ idAccount);
        //Account a = (Account) daoJpa.getAccountById(idAccount); 
        
        String nom  = (String) request.getParameter("nom");
        System.out.println(nom);
        String prenom = (String) request.getParameter("prenom");
        System.out.println(prenom);
        String adresse  = (String) request.getParameter("adresse");
        System.out.println(adresse);
        double solde = Double.parseDouble((request.getParameter("solde")));
        System.out.println(solde); 
        String login = (String) request.getParameter("login");
        System.out.println(login);
        String password = (String) request.getParameter("password");
        System.out.println(password);
        String iban = (String) request.getParameter("iban"); 
        System.out.println(iban); 
        
        daoJpa.updateAccount(idAccount, nom, prenom, adresse, solde, login, password, iban);
        
        HttpSession session = request.getSession();
            Collection userValues = daoJpa.getAllAccounts();        
            session.setAttribute("userValues", userValues);           
        
            RequestDispatcher dispatcher = request.getRequestDispatcher("/modifAccount.jsp");
            dispatcher.forward(request, response);
    }   
    
    // supprimer un compte dans la base
    private void supprimerAccount(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération du compte sélectionné
        String id = (String) request.getParameter("idAccountSup");
         System.out.println("idString : "+ id);
        int idAccount = Integer.parseInt(id);     
         System.out.println("idSelectionné : "+ idAccount);
        Account a = (Account) daoJpa.getAccountById(idAccount); 
        daoJpa.deleteAccount(a);
        
        HttpSession session = request.getSession();
            Collection userValues = daoJpa.getAllAccounts();        
            session.setAttribute("userValues", userValues);           
        
            RequestDispatcher dispatcher = request.getRequestDispatcher("/modifAccount.jsp");
            dispatcher.forward(request, response);
    }   
    
    
     // modifier un presta dans la base (étape 1/2)
    private void modifierPresta(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération du presta sélectionné
        String idPresta = (String) request.getParameter("idPrestaModif");
         System.out.println("idString : "+ idPresta);
         int intIdPresta = Integer.parseInt(idPresta);     
         System.out.println("idSelectionné : "+ intIdPresta);
        Product p = (Product) daoJpa.getProductById(intIdPresta);  
  
        request.getSession().setAttribute("prestaModif", p);
        RequestDispatcher dispatcher = request.getRequestDispatcher("/modifPresta2.jsp");
        dispatcher.forward(request, response);
    }
    
    // modifier le compte dans la base (étape 2/2)
    private void modifierPresta2(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        String id = (String) request.getParameter("idPrestaModif");
        int idPresta = Integer.parseInt(id);     
         System.out.println("idSelectionné : "+ idPresta);
        //Account a = (Account) daoJpa.getAccountById(idAccount); 
        
        String nom  = (String) request.getParameter("nom");
        System.out.println(nom);
        String prenom = (String) request.getParameter("prenom");
        System.out.println(prenom);
        String description  = (String) request.getParameter("description");
        System.out.println(description);
        double prix = Double.parseDouble((request.getParameter("prix")));
        System.out.println(prix); 
        String reference = (String) request.getParameter("reference");
        int intReference = Integer.parseInt(reference);     
        System.out.println(intReference); 
        String etat = (String) request.getParameter("etat");     
        //Char newEtat =  new Char ("'"+ intEtat +"'");
        etat = "'" + etat + "'";
        System.out.println(etat);
        String categorie = (String) request.getParameter("categorie"); 
        int intCategorie = Integer.parseInt(categorie);     
        System.out.println(intCategorie); 
        
        daoJpa.updatePresta(idPresta, nom, prenom, description, prix, intReference, etat , intCategorie);
         
        HttpSession session = request.getSession();
             Collection mesPrestataires = daoJpa.getAllProducts();
             session.setAttribute("mesPrestataires", mesPrestataires);          
        
            RequestDispatcher dispatcher = request.getRequestDispatcher("/modifPresta.jsp");
            dispatcher.forward(request, response);
    }   
    
    // supprimer un presta dans la base
    private void supprimerPresta(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération du compte sélectionné
        String id = (String) request.getParameter("idPrestaSup");
         System.out.println("idString : "+ id);
        int idProduct = Integer.parseInt(id);     
         System.out.println("idSelectionné : "+ idProduct);
        Product presta = (Product) daoJpa.getProductById(idProduct); 
        daoJpa.deleteProduct(presta);
        
        HttpSession session = request.getSession();
            Collection mesPrestataires = daoJpa.getAllProducts();        
            session.setAttribute("mesPrestataires", mesPrestataires);           
        
            RequestDispatcher dispatcher = request.getRequestDispatcher("/modifPresta.jsp");
            dispatcher.forward(request, response);
    }       
    
    
     // ajoute un productStore dans la base
    private void ajoutProductStore(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération des données du formulaire 
        int idProductStore = 0;
        String nom  = (String) request.getParameter("nom");
        String description = (String) request.getParameter("description");
        String iban = (String) request.getParameter("iban"); 
         
        daoJpa.addProductStore(idProductStore, nom, description, iban);
        
        HttpSession session = request.getSession();
            Collection mesProductStore = daoJpa.getAllProductStore();
            session.setAttribute("mesProductStore", mesProductStore);
            
            RequestDispatcher dispatcher = request.getRequestDispatcher("/modifProductStore.jsp");
            dispatcher.forward(request, response);
    } 
    
     // modifier un productStore dans la base
    private void modifierProductStore(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération le compte sélectionné
        String reference = (String) request.getParameter("referenceProductStoreModif");
         System.out.println("idString : "+ reference);
         int intReference = Integer.parseInt(reference);     
         System.out.println("idSelectionné : "+ intReference);
        ProductStore ps = (ProductStore) daoJpa.getProductStoreByReference(intReference);  
  
        request.getSession().setAttribute("productStoreModif", ps);
        RequestDispatcher dispatcher = request.getRequestDispatcher("/modifProductStore2.jsp");
        dispatcher.forward(request, response);
    }
    
     // modifier un productStore dans la base
    private void modifierProductStore2(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération le compte sélectionné
        String reference = (String) request.getParameter("referenceProductStoreModif");
         int intReference = Integer.parseInt(reference);     
         System.out.println("idSelectionné : "+ intReference);
        
        String nom  = (String) request.getParameter("nom");
        System.out.println(nom);
        String description = (String) request.getParameter("description");
        System.out.println(description);
        String iban = (String) request.getParameter("iban"); 
        System.out.println(iban);
        
        daoJpa.updateProductStore(intReference, nom, description, iban);
        
        HttpSession session = request.getSession();
            Collection mesProductStore = daoJpa.getAllProductStore();        
            session.setAttribute("mesProductStore", mesProductStore);      
            
        RequestDispatcher dispatcher = request.getRequestDispatcher("/modifProductStore.jsp");
        dispatcher.forward(request, response);
    }
    
    // supprimer un productStore
    private void supprimerProductStore(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {    
        // Récupération du productStore sélectionné
        String reference = (String) request.getParameter("referenceProductStoreSup");
        System.out.println("idString : "+ reference);
        int referenceInt = Integer.parseInt(reference);     
        System.out.println("idSelectionné : "+ referenceInt);
        ProductStore ps = (ProductStore) daoJpa.getProductStoreByReference(referenceInt); 
        daoJpa.deleteProductStore(ps);
        
        //Boîte du message d'information
        //JOptionPane jop1 = new JOptionPane();
        //jop1.showMessageDialog(null, "Le productStore à bien été supprimé ", "Message de validation", JOptionPane.INFORMATION_MESSAGE);
        
        HttpSession session = request.getSession();
            Collection mesProductStore = daoJpa.getAllProductStore();
            session.setAttribute("mesProductStore", mesProductStore);        
            RequestDispatcher dispatcher = request.getRequestDispatcher("/modifProductStore.jsp");
            dispatcher.forward(request, response);      
    }   
    
    
    // ajoute un commentaire pour le presta selectionné
    private void ajouterCommentaire (HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération des données du formulaire 
        int idSelectedPresta = Integer.parseInt(request.getParameter("idPresta"));
        Product p = (Product) daoJpa.getProductById(idSelectedPresta);
        
        HttpSession session = request.getSession();
        request.getSession().setAttribute("monPresta", p );
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/ajoutCommentaire.jsp");
        dispatcher.forward(request, response);
    }
    
    
     // ajoute un commentaire pour le presta selectionné
    private void ajoutCommentaire (HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        // Récupération des données du formulaire 
        String id = (String) request.getParameter("selected_presta");
        System.out.println("idString : "+ id);
        int idSelectedPresta = Integer.parseInt(id);
         System.out.println("idSelectionné : "+ idSelectedPresta);
        int idCommentaire = 0;
        String commentaire  = (String) request.getParameter("commentaire");
        String note = (String) request.getParameter("note");
        
        System.out.println("Commentaire: "+ commentaire);
        System.out.println("note : "+ note);      
        daoJpa.addCommentaire(idCommentaire, commentaire, note, idSelectedPresta);
                    
        Product p_presta = daoJpa.getProductById(idSelectedPresta);
        Collection listeCommentaires = daoJpa.getAllCommentairesOfProduct(p_presta); 
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();            
            
             // Récupération des produits "si vous avez aimé ceci, alors vous pourrez aimer cela..."
        List <Product> pre_listeotherprod = new ArrayList<Product>();
        List <Product> listeotherprod = new ArrayList<Product>();
        pre_listeotherprod = daoJpa.getAllProducts();
        
        if (pre_listeotherprod != null) 
        {
            Iterator<Product> iter_pre_oth = pre_listeotherprod.iterator();
            while (iter_pre_oth.hasNext()) 
            {
                Product pre_oth_tmp = iter_pre_oth.next();
                if (pre_oth_tmp.getCategorieidCategorie() == p_presta.getCategorieidCategorie()) 
                {
                    listeotherprod.add(pre_oth_tmp);
                }
            }
        }
        
        if (listeCommentaires.isEmpty()) {
            request.setAttribute("noComment", "true");
        }
        else {
            request.setAttribute("noComment", "false");
        }
        
        // Remplissage des différentes variables session et requête
        request.setAttribute("listeotherprod", listeotherprod);       
        request.setAttribute("listeCommentaires", listeCommentaires);        
        request.getSession().setAttribute("p_presta", p_presta);
        request.setAttribute("listephotos", listephotos);
         RequestDispatcher dispatcher = request.getRequestDispatcher("/cv.jsp");
         dispatcher.forward(request, response);
    }
    
    // Récupère la liste des développeurs
    private void developer(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        List <Product> developpeurs = new ArrayList<Product>();
        developpeurs = daoJpa.getAllDevelopers();
        request.setAttribute("developpeurs", developpeurs);
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/portfolio_developer.jsp");
        dispatcher.forward(request, response);
    }
    
    // Récupère la liste des chefs de projets
    private void projectManager(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        List <Product> chefsProjets = new ArrayList<Product>();
        chefsProjets = daoJpa.getAllProjectManagers();   
        request.setAttribute("chefsProjets", chefsProjets);
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/portfolio_projectmanager.jsp");
        dispatcher.forward(request, response);
    }
    
    // Récupère la liste des responsables produits
    private void productManager(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        List <Product> responsablesProduits = new ArrayList<Product>();
        responsablesProduits = daoJpa.getAllProductManagers();
        request.setAttribute("responsablesProduits", responsablesProduits);
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/portfolio_productmanager.jsp");
        dispatcher.forward(request, response);
    }
    
    // Récupère la liste des consultants
    private void consultant(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
       
        List <Product> consultants = new ArrayList<Product>();
        consultants = daoJpa.getAllConsultants();
        request.setAttribute("consultants", consultants);
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/portfolio_consultant.jsp");
        dispatcher.forward(request, response);
    }
    
    // Récupère la liste des architectes
    private void architect(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        List <Product> architectes = new ArrayList<Product>();
        architectes = daoJpa.getAllArchitects();
        request.setAttribute("architectes", architectes);
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/portfolio_architect.jsp");
        dispatcher.forward(request, response);
    }
    
    // Récupère la liste des coachs/Scrum Masters
    private void coach(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        List <Product> coachs = new ArrayList<Product>();
        coachs = daoJpa.getAllCoachs();
        request.setAttribute("coachs", coachs);
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/portfolio_coach.jsp");
        dispatcher.forward(request, response);
    }
    
    // Récupère la liste des product stores : SSII partenaires
    private void productStores(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        List <ProductStore> partenaires = new ArrayList<ProductStore>();
        partenaires = daoJpa.getAllProductStore();
        request.setAttribute("partenaires", partenaires);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/portfolio_productstore.jsp");
        dispatcher.forward(request, response);
    }   
    
    // Récupère la liste des categories
    private void categorie(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
        
        List <Categorie> categories = new ArrayList<Categorie>();
        categories = daoJpa.getAllCategories();
        request.setAttribute("categories", categories);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/accueil.jsp");
        dispatcher.forward(request, response);
    }
    
    // Récupère la liste des photos d'un prestataire
    private void photos(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException {
                       
        List <Photo> photosPresta = new ArrayList<Photo>();
        photosPresta = daoJpa.getAllPhotosOfPresta(null);
        request.setAttribute("photosPresta", photosPresta);
       
        RequestDispatcher dispatcher = request.getRequestDispatcher("");
        dispatcher.forward(request, response);
    }
    
    // Affiche un caddie, en récupérant la liste
    // des commandes d'un Account, puis
    // en cherchant les Products commandés ( un Product par commande )
    private void displayCart(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        Account acc = (Account) request.getSession().getAttribute("account");
        
        if (acc != null) 
        {
            System.err.println("Servlet -- displayCart : acc n'est pas nul.");
            System.err.println("Servlet -- displayCart : Nom Account == " + acc.getNom());
            String id_acc_s = String.valueOf(acc.getIdAccount());

            // Affichage interne pour les tests
            System.err.println("Servlet -- displayCart : id_acc_s == " + id_acc_s);
        
            // Récupération de toutes les commandes de l'Account
            // Attention : il faudra rajouter un booléen dans la table
            // Commande pour dire si la commande est payée ou pas...
            List <Commande> cmds_c1 = new ArrayList<Commande>();
            cmds_c1 = daoJpa.getAllCommandesOfAccount(Integer.parseInt(id_acc_s));
        
            if (! cmds_c1.isEmpty()) 
            {
                System.err.println("Servlet -- displayCart : liste des commandes non vide !");
                // Récupération des Products associés aux Commandes ( via une liste )
                List <Product> cmds = new ArrayList<Product>();
                Iterator iter = cmds_c1.iterator();
        
                // Construction de la liste des Products
                while (iter.hasNext()) 
                {
                    Commande c = (Commande) iter.next();
                    Product p_tmp = daoJpa.getProductByIdCommande(c.getIdCommande());
                    cmds.add(p_tmp);
                }
        
                request.getSession().setAttribute("cart_commandes_isEmpty", "false");
                request.getSession().setAttribute("cart_commandes_c", cmds_c1);
                request.getSession().setAttribute("cart_commandes_p", cmds);    
            }
            else // Liste des commandes vide
            {
                System.err.println("Servlet -- displayCart : liste des commandes vide.");
                request.getSession().setAttribute("cart_commandes_isEmpty", "true");
            }
  
            
        }
        else // acc == null
        {
            // Affichage interne pour les tests
            System.err.println("Servlet -- displayCart : acc == null");
            // Création d'un compte invité, temporaire jusqu'à l'enregistrement d'un vrai compte
            acc = new Account();
            // TODO ( W. ) : Créer le compte guest
        }
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/displayCart.jsp");
        dispatcher.forward(request, response);
    }
    
    // Entame le paiement d'un panier ( 4 pages )
    private void buyCart(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        Account acc = (Account) request.getSession().getAttribute("account");
        Cart_calcTotalPrice c_cTP1 = new Cart_calcTotalPrice();
        Double prix_total_cart = new Double("0");
        
        if (acc != null) 
        {
            System.err.println("Servlet -- buyCart : acc n'est pas nul.");
            System.err.println("Servlet -- buyCart : Nom Account == " + acc.getNom());
            String id_acc_s = String.valueOf(acc.getIdAccount());

            // Affichage interne pour les tests
            System.err.println("Servlet -- buyCart : id_acc_s == " + id_acc_s);
        
            // Récupération de toutes les commandes de l'Account
            // Attention : il faudra rajouter un booléen dans la table
            // Commande pour dire si la commande est payée ou pas...
            List <Commande> cmds_c1 = new ArrayList<Commande>();
            cmds_c1 = daoJpa.getAllCommandesOfAccount(Integer.parseInt(id_acc_s));
        
            if (! cmds_c1.isEmpty()) 
            {
                System.err.println("Servlet -- displayCart : liste des commandes non vide !");
                // Récupération des Products associés aux Commandes ( via une liste )
                List <Product> cmds = new ArrayList<Product>();
                Iterator iter = cmds_c1.iterator();
        
                // Construction de la liste des Products
                while (iter.hasNext()) 
                {
                    Commande c = (Commande) iter.next();
                    Product p_tmp = daoJpa.getProductByIdCommande(c.getIdCommande());
                    cmds.add(p_tmp);
                }
        
                request.getSession().setAttribute("cart_commandes_isEmpty", "false");
                request.getSession().setAttribute("cart_commandes_c", cmds_c1);
                request.getSession().setAttribute("cart_commandes_p", cmds);    
            }
            else // Liste des commandes vide
            {
                request.getSession().setAttribute("cart_commandes_isEmpty", "true");
            }
        }
        else // acc == null
        {
            // Affichage interne pour les tests
            System.err.println("Servlet -- displayCart : acc == null");
            // Création d'un compte invité, temporaire jusqu'à l'enregistrement d'un vrai compte
            acc = new Account();
            // TODO ( W. ) : Créer le compte guest
        }
        
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        request.setAttribute("listephotos", listephotos);
        
        // Gestion du panier en cours
        List<Product> current_cart_prds = (ArrayList<Product>) 
                request.getSession().getAttribute("current_cart_prds");
        
        // Si la liste est nulle, on en refait une autre
        if (current_cart_prds == null) {
            current_cart_prds = new ArrayList<Product>();
        }
        
        // Calcul du prix total pour la première page du paiement
        prix_total_cart = c_cTP1.getTotalPrice(current_cart_prds);
        request.setAttribute("buycart_p1_prixtotalcart", prix_total_cart);
        
        // On ne peut pas acheter un panier vide, voyons :)
        if (!current_cart_prds.isEmpty()) 
        {
            RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_p1.jsp");
            dispatcher.forward(request, response);    
        }
        else 
        {
            RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_empty.jsp");
            dispatcher.forward(request, response);
        }
        
    }
    
    // Valide la première page du paiement ( le panier )
    //
    // Si l'utilisateur est déjà identifié, on peut passer directement à
    // la troisième étape ( la livraison ), sinon on peut soit s'identifier
    // soit s'inscrire.
    private void buycart_p1_valider(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        Account acc = (Account) request.getSession().getAttribute("account");
        
        if (acc != null) 
        {
            System.err.println("Servlet -- buycart_p1_valider : acc n'est pas nul.");
            System.err.println("Servlet -- buycart_p1_valider : Nom Account == " + acc.getNom());
            RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_p3.jsp");
            dispatcher.forward(request, response);
        }
        else // acc == null
        {
            RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_p2.jsp");
            dispatcher.forward(request, response);
        }
        

    }
    
    // Login lorsqu'on est sur la page 2 du paiement, volet de gauche.
    private void buycart_p2_login(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
	// Récupération des données du formulaire
        String login2 = (String) request.getParameter("buycart_p2_login");
        String pwd2 = (String) request.getParameter("buycart_p2_pwd");
        
        Account client = daoJpa.getAccountByLoginAndPass(login2, pwd2);
        if (client != null) 
        {
            HttpSession session = request.getSession();

            session.setAttribute("account", client);
            session.setAttribute("isLoggedIn", "true");
            session.setAttribute("buycart_p2_loginfailed", "false");
            
            RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_p3.jsp");
            dispatcher.forward(request, response);
        }
        else 
        {              
            HttpSession session = request.getSession();

            session.setAttribute("isLoggedIn", "false");
            session.setAttribute("buycart_p2_loginfailed", "true");
            
            RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_p2.jsp");
            dispatcher.forward(request, response);
        }   
        
    }
    
    // Inscription lorsqu'on est sur la page 2 du paiement, volet de droite.
    private void buycart_p2_subscribe(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        // Récupération des données du formulaire
        // Id de 0 = Auto-Incrément au dernier id ajouté
        int idAccount = 0;
        int accessLevel = 0;
        
        String nom  = (String) request.getParameter("nom");
        String prenom = (String) request.getParameter("prenom");
        String adresse  = (String) request.getParameter("adresse");
        double solde = new Double(0);
        String login = (String) request.getParameter("login");
        String password = (String) request.getParameter("password");
        String iban = (String) request.getParameter("iban"); 
        int idcart = 0;   
        daoJpa.addAccount(idAccount, nom, prenom, adresse, solde, login, password, accessLevel, iban, idcart);

        Account client = daoJpa.getAccountByLoginAndPass(login, password);
        if (client != null) 
        {
            HttpSession session = request.getSession();

            session.setAttribute("account", client);
            session.setAttribute("isLoggedIn", "true");
            session.setAttribute("buycart_p2_subscribefailed", "false");
            
            RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_p3.jsp");
            dispatcher.forward(request, response);
        }
        else 
        {              
            HttpSession session = request.getSession();
            session.setAttribute("isLoggedIn", "false");
            session.setAttribute("buycart_p2_subscribefailed", "true");
            
            RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_p2.jsp");
            dispatcher.forward(request, response);
        }  
    }
    
    // Valide la troisième page du paiement ( l'adresse de livraison )
    private void buycart_p3_valider(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        Cart_calcTotalPrice c_cTP1 = new Cart_calcTotalPrice();
        Double prix_total_cart = new Double("0");
        Double prix_plus_port = new Double("0");
        Double prix_ttc0 = new Double("0");
        Double prix_ttc = new Double("0");
        
        Account acc = (Account) request.getSession().getAttribute("account");
        // acc ne peut pas être nul à ce stade ( l'accès à cette page requiert un login )
        
        // Récupération du panier en cours
        List<Commande> current_cart_cmds = (ArrayList<Commande>) 
                request.getSession().getAttribute("current_cart_cmds");
        List<Product> current_cart_prds = (ArrayList<Product>) 
                request.getSession().getAttribute("current_cart_prds");
        
        // Si les listes sont nulles ( mais cela ne devrait pas être le cas ), on les créé
        if (current_cart_cmds == null) {
            current_cart_cmds = new ArrayList<Commande>();
        }
        if (current_cart_prds == null) {
            current_cart_prds = new ArrayList<Product>();
        }
        prix_total_cart = c_cTP1.getTotalPrice(current_cart_prds);
        prix_plus_port = prix_total_cart + 99.9;
        prix_ttc0 =  prix_plus_port + ((prix_plus_port * 5.5)/100);
        prix_ttc = (Math.floor(prix_ttc0 * 100+0.5))/100;
        request.getSession().setAttribute("buycart_p4_prixtotalcart0", prix_total_cart);
        request.getSession().setAttribute("buycart_p4_prixht", prix_plus_port);
        request.getSession().setAttribute("buycart_p4_prixttc", prix_ttc);
        
        if (acc.getSolde() >= prix_ttc) {
            request.getSession().setAttribute("buycart_p4_PeutPayer", "true");
        }
        else {
            request.getSession().setAttribute("buycart_p4_PeutPayer", "false");
        }
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_p4.jsp");
        dispatcher.forward(request, response);
    }
    
    // Valide le paiement sur la page 4 et permet d'accéer à la page 5, avec l'ajout
    // des commandes dans l'historique du compte et la modification de l'état
    // de chaque presta acheté.
    private void buycart_p4_payer(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        Account acc = (Account) request.getSession().getAttribute("account");
        // acc ne peut pas être nul à ce stade ( l'accès à cette page requiert un login )
        
        // Récupération du panier en cours
        List<Commande> current_cart_cmds = (ArrayList<Commande>) 
                request.getSession().getAttribute("current_cart_cmds");
        List<Product> current_cart_prds = (ArrayList<Product>) 
                request.getSession().getAttribute("current_cart_prds");
        
        // Si les listes sont nulles ( mais cela ne devrait pas être le cas ), on les créé
        if (current_cart_cmds == null) {
            current_cart_cmds = new ArrayList<Commande>();
        }
        if (current_cart_prds == null) {
            current_cart_prds = new ArrayList<Product>();
        }
        
        Cart_calcTotalPrice c_cTP1 = new Cart_calcTotalPrice();
        Double prix_total_cart = new Double("0");
        Double prix_plus_port = new Double("0");
        Double prix_ttc0 = new Double("0");
        Double prix_ttc = new Double("0");
        prix_total_cart = c_cTP1.getTotalPrice(current_cart_prds);
        prix_plus_port = prix_total_cart + 99.9;
        prix_ttc0 =  prix_plus_port + ((prix_plus_port * 5.5)/100);
        prix_ttc = (Math.floor(prix_ttc0 * 100+0.5))/100;
        double new_acc_solde = -prix_ttc;
        
        // Mise à jour du compte
        daoJpa.updateAccountWithSolde(acc, new_acc_solde);
        Account new_acc = daoJpa.getAccountById(acc.getIdAccount());
        
        HttpSession session = request.getSession();
        session.setAttribute("account", new_acc);
        
        // Mise à jour des états des prestas
        Iterator<Product> iter_p = current_cart_prds.iterator();
        while (iter_p.hasNext()) {
            Product p_maj_tmp = iter_p.next();
            daoJpa.updateProductEtat(p_maj_tmp.getIdProduct(), "3");
        }
        
        // Remplissage de l'historique des commandes
        if (current_cart_cmds != null) {
            Iterator<Commande> itc = current_cart_cmds.iterator();
            while (itc.hasNext()) {
                Commande cmd_tmp = itc.next();
                daoJpa.addCommande(cmd_tmp.getIdCommande(), new_acc.getIdAccount());
            }
        }
        
        // Suppression du panier
        request.getSession().setAttribute("current_cart_prds", null);
        request.getSession().setAttribute("current_cart_cmds", null);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/buycart_p5.jsp");
        dispatcher.forward(request, response);
    }
    
    // Crédite le solde du compte ( page 4 du paiement ).
    // Doit rediriger sur la page 4 puisqu'on recharge les informations
    // avec le nouveau solde.
    private void buycart_p4_credit(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        Account acc = (Account) request.getSession().getAttribute("account");
        // acc ne peut pas être nul à ce stade ( l'accès à cette page requiert un login )

        // TODO ( W. ) : Gérer l'historique des commandes ( ce n'est pas fait encore ).
        
        // Récupération des crédits donnés
        int added_credits_i = Integer.parseInt(request.getParameter("buycart_p4_credits"));
        double added_credits_d = (double) added_credits_i;
        
        // Mise à jour du compte
        daoJpa.updateAccountWithSolde(acc, added_credits_d);
        Account new_acc = daoJpa.getAccountById(acc.getIdAccount());
        
        HttpSession session = request.getSession();
        session.setAttribute("account", new_acc);
        
        buycart_p3_valider(request, response);
    }
    
    // Affiche le CV et la Photo du prestataire sélectionné
    public void afficherPresta(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException 
    {
        // Récupération de l'id du presta concerné
        int idSelectedPresta = Integer.parseInt(request.getParameter("selected_presta"));
        Product p_presta = new Product();
        // Récupération de l'objet prestataire 
        p_presta = daoJpa.getProductById(idSelectedPresta);
        // Récupération de son CV  
        int idCV = p_presta.getCVidCV();
        Cv cvOfPresta = daoJpa.getCvById(idCV);
        //Récupération de ses commentaires 
        List <Commentaire> listeCommentaires = new ArrayList<Commentaire>();
        listeCommentaires = daoJpa.getAllCommentairesOfProduct(p_presta);
        // Récupération des photos
        List <Photo> listephotos = new ArrayList<Photo>();
        listephotos = daoJpa.getAllPhotos();
        
        // Récupération des produits "si vous avez aimé ceci, alors vous pourrez aimer cela..."
        List <Product> pre_listeotherprod = new ArrayList<Product>();
        List <Product> listeotherprod = new ArrayList<Product>();
        pre_listeotherprod = daoJpa.getAllProducts();
        
        if (pre_listeotherprod != null) 
        {
            Iterator<Product> iter_pre_oth = pre_listeotherprod.iterator();
            while (iter_pre_oth.hasNext()) 
            {
                Product pre_oth_tmp = iter_pre_oth.next();
                if (pre_oth_tmp.getCategorieidCategorie() == p_presta.getCategorieidCategorie()) 
                {
                    listeotherprod.add(pre_oth_tmp);
                }
            }
        }
        
        if (listeCommentaires.isEmpty()) {
            request.setAttribute("noComment", "true");
        }
        else {
            request.setAttribute("noComment", "false");
        }
        
        // Remplissage des différentes variables session et requête
        request.getSession().setAttribute("cvOfPresta", cvOfPresta);
        request.getSession().setAttribute("p_presta", p_presta);
        request.setAttribute("listephotos", listephotos);
        request.setAttribute("listeotherprod", listeotherprod);
        request.setAttribute("listeCommentaires", listeCommentaires);
        
        RequestDispatcher dispatcher = request.getRequestDispatcher("/cv.jsp");
        dispatcher.forward(request, response);
    }
    
    
    // Ajoute le presta au panier en cours
    public void ajouterPrestaPanier(HttpServletRequest request, HttpServletResponse response,
            int idSelectedPresta) 
            throws SQLException, ServletException, IOException 
    {
        Product p_presta = new Product();
        CalcIdMax cim = new CalcIdMax();
        
        // Gestion du panier en cours
        List<Commande> current_cart_cmds = (ArrayList<Commande>) 
                request.getSession().getAttribute("current_cart_cmds");
        List<Product> current_cart_prds = (ArrayList<Product>) 
                request.getSession().getAttribute("current_cart_prds");
        
        // Si les listes sont nulles ( notamment lors du premier ajout ), on les créé
        if (current_cart_cmds == null) {
            current_cart_cmds = new ArrayList<Commande>();
        }
        if (current_cart_prds == null) {
            current_cart_prds = new ArrayList<Product>();
        }
        
        // Obtention de l'id maximum des Commandes
        List<Commande> list_cmd1 = daoJpa.getAllCommandes();
        int id_max_cmd = cim.getMaxIdCommandes(list_cmd1, current_cart_cmds);
        
        // Mise à jour du presta avec le numéro de la commande
        daoJpa.updateProductEtat(idSelectedPresta, "2");
        p_presta = daoJpa.getProductById(idSelectedPresta);
        if (p_presta != null) 
        {
            // Création de la nouvelle commande avec le produit en question
            Commande new_cmd = new Commande(id_max_cmd + 1, p_presta.getIdProduct());
            p_presta.setCommandeidCommande(new_cmd.getIdCommande());
            daoJpa.updateProductWithIdCommande(p_presta, new_cmd.getIdCommande());
            // Ajout dans les listes
            current_cart_prds.add(p_presta);
            current_cart_cmds.add(new_cmd);
        }
        
        // Affichage interne pour les tests
        System.err.println("Servlet -- ajouterPrestaPanier : Affichage des éléments des listes");
        Iterator<Product> itp = current_cart_prds.iterator();
        while (itp.hasNext()) 
        {
            Product p_tmp = itp.next();
            System.err.println("Servlet -- ajouterPrestaPanier prds : id == " + String.valueOf(p_tmp.getIdProduct()));
            System.err.println("Servlet -- ajouterPrestaPanier prds : nom == " + p_tmp.getNom());
        }
        System.err.println("Servlet -- ajouterPrestaPanier : __________________________________");
        Iterator<Commande> itc = current_cart_cmds.iterator();
        while (itc.hasNext()) 
        {
            Commande c_tmp = itc.next();
            System.err.println("Servlet -- ajouterPrestaPanier cmds : idCommande == " + String.valueOf(c_tmp.getIdCommande()));
            System.err.println("Servlet -- ajouterPrestaPanier cmds : idAccount == " + String.valueOf(c_tmp.getAccountidAccount()));
        }
        
        request.getSession().setAttribute("current_cart_prds", current_cart_prds);
        request.getSession().setAttribute("current_cart_cmds", current_cart_cmds);

        displayCart(request, response);
    }

    // Retire un prestataire du panier en cours
    public void retirerPrestaPanier(HttpServletRequest request, HttpServletResponse response,
            int idSelectedPresta) 
            throws SQLException, ServletException, IOException 
    {
        Product p_presta = new Product();
        int idSelectedCmd = 0;
        
        // Récupération du panier en cours
        List<Commande> current_cart_cmds = (ArrayList<Commande>) 
                request.getSession().getAttribute("current_cart_cmds");
        List<Product> current_cart_prds = (ArrayList<Product>) 
                request.getSession().getAttribute("current_cart_prds");
        
        // Si les listes sont nulles, on les créé
        if (current_cart_cmds == null) {
            current_cart_cmds = new ArrayList<Commande>();
        }
        if (current_cart_prds == null) {
            current_cart_prds = new ArrayList<Product>();
        }
        
        // Récupération de l'id de la commande liée au presta sélectionné
        daoJpa.updateProductEtat(idSelectedPresta, "1");
        p_presta = daoJpa.getProductById(idSelectedPresta);
        if (p_presta != null) 
        {
            Iterator<Product> recup_idc = current_cart_prds.iterator();
            while (recup_idc.hasNext()) 
            {
                Product prod_tmp = recup_idc.next();
                if (prod_tmp.getIdProduct() == idSelectedPresta) 
                {
                    idSelectedCmd = prod_tmp.getCommandeidCommande();
                }
            }
            daoJpa.updateProductWithIdCommande(p_presta, 0);
        }
        
        // Création des deux nouvelles listes temporaires
        List<Commande> tmp_current_cart_cmds = new ArrayList<Commande>();
        List<Product> tmp_current_cart_prds = new ArrayList<Product>();
        
        // Copie des listes : on va ignorer l'élément supprimé lors de la copie
        Iterator<Commande> itc = current_cart_cmds.iterator();
        while (itc.hasNext()) {
            Commande c_tmp = itc.next();
            if (c_tmp.getIdCommande() != idSelectedCmd) {
                tmp_current_cart_cmds.add(c_tmp);
            }
        }
        
        Iterator<Product> itp = current_cart_prds.iterator();
        while (itp.hasNext()) {
            Product p_tmp = itp.next();
            if (p_tmp.getIdProduct() != idSelectedPresta) {
                tmp_current_cart_prds.add(p_tmp);
            }
        }
        
        // Remplacement des listes
        request.getSession().setAttribute("current_cart_prds", tmp_current_cart_prds);
        request.getSession().setAttribute("current_cart_cmds", tmp_current_cart_cmds);
        
        displayCart(request, response);
    }

    public void politiqueConf(HttpServletRequest request, HttpServletResponse response) 
            throws SQLException, ServletException, IOException
    {
        RequestDispatcher dispatcher = request.getRequestDispatcher("/politiqueConf.jsp");
        dispatcher.forward(request, response);
    }
    
}
